又稱Oracle,在各個區塊鏈中僅信任其區塊中的資訊,無法使用外部的資訊,在比特幣網路中僅紀錄比特幣的交易還夠用,但對於其他公鍊如以太坊上可以運行智能合約,就會需要使用到外部的訊息,而如何確保來自外部的訊息是正確的就需要預言機,舉例如在以太坊上部署智能合約內容是飛機延誤險,而如何確定飛機是否延誤則需依靠預言機來獲取外部的訊息再回傳到鍊上,藉此來決定是否調用智能合約內的內容。
是一個去中心化的預言機,在智能合約向Chainlink調閱資料時,Chainlink會調用不特定數量的節點,這些節點會抵押一些Link token然後各自回傳其獲取到的資訊,會篩選出信用良好的節點且剔除極端的資訊,最後算出合理的資訊回傳給智能合約,如此可以確保資料的正確性且資料並不是單一的來源,而被剔除的節點無法拿回抵押的代幣而獲用的節點則可以獲得獎勵,更進一步增加正確性。目前已有許多的項目如Ethereum、Polkadot等與Chainlink合作。
先引入Chainlink
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
實作出function
第一個為Chainlink中實作的方法,根據地址返回對應的幣種價格
//查詢ETH價錢
function EthPrice() internal view returns(int){
AggregatorV3Interface dataFeed = AggregatorV3Interface(0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e);
(
/* uint80 roundID */,
int answer,
/*uint startedAt*/,
/*uint timeStamp*/,
/*uint80 answeredInRound*/
) = dataFeed.latestRoundData();
return answer;
}
可到以下網址選擇查詢的地址
https://docs.chain.link/data-feeds/price-feeds/addresses?network=ethereum&page=1
自行實作出轉換的功能
//ETH轉成USD
function ethToUsd(uint _number) internal view returns(uint){
int ethPrice = EthPrice();
uint ethInUsd = (uint(ethPrice) * _number)/1e26;
return ethInUsd;
}